﻿
※SHOPフォルダのファイル構造が大きく変わっているので上書きできません。
　試してみてくれる方は、バックアップをとって
　最新版のSHOPフォルダとまるごと差し替えてください。

※SYSTEMフォルダのほうは上書きできます。
　@COLOR関数に１色追加しただけです。




----------------------------------------------------------------------------------------------------
#SHOPメニューの整理テスト
----------------------------------------------------------------------------------------------------

##概要
	SHOPメニューの処理と表示周りの整理をしてみた。
	個人的にはこうなってると作業しやすい気がするけど、他の人にとってもそうかはわからない。
	余計な処理とかしてるかもしれないけど自分なりに頑張った。


##きっかけ
	前スレか前々スレくらいで、メニュー処理を改変してみていい？というレスを見て
	どんどんやってという作者様のレスを見たので、何かお手伝いできることは～と作業を始めました。
	簡単なところを分解するだけのつもりだったんですが、いつの間にか余計なところまで弄ってた。

	改変について尋ねてらした方とは別人なので、
	作業内容がかぶってしまったらスルーしてそちらを優先してください。
	何か下準備のお役に立てていただければ幸い。


##改変ベース
	改変は0.245をベースに行いました。
	その後、ver0.249のSHOPフォルダの中身だけ比較して上書きしました。


##権利絡み
	eratohoK本体規約に準じます。
	本体に取り込まれた場合、SHOPメニューの整理テストの製作者は権利を放棄します。


##詳細
	+SHOP_LIFE系の分解
		SHOP_LIFE.ERBとLIFE_MENU.ERBを分解しました。
		点在していたメニューの処理をなるべく１メニュー１ファイルにまとめ、
		日本語のメニュー名をファイルに添えてフォルダにまとめました。

		描写まとめや能力表示一覧等の巨大な分岐は２ファイルになっています。


	+左カラムのメニューにカテゴリを追加
		完全な連番にすると番号の差し替え・追加が大変そうだと思い
		便宜上、メニューをいくつかの塊に分けました。

		交流・Ｈ系↑
		情報系→
		ワンクリックでカラム形式から外に出る系↓（各カテゴリの下部）
		余裕の出る後半からの使用を想定してそう系↓
		単発系↓

		カテゴリ名はなるべくメニューの用途がわかりやすいように考えてみましたが
		SHOP_LIFE_COLUMN_LEFT.ERBにあるので作者様のお好みに整えて頂ければ幸いです。


	+全メニューに番号を割り当て
		メイン処理からTRYCALLFORM 関数名{メニュー番号}で
		メニューフォルダにまとめた各処理を呼ぶ想定だったので（COMF形式）
		便宜上、全てのメニューに番号を振りました。

		元々FLAGの割り当てられていたメニューも番号が全て変わっています（1000番会いに行く→11番等）

		番号の指定方法は、カテゴリ番号*10+カテゴリ内の並び順にしました。
		カテゴリ1番「親交」のメニュー1番「会いに行く」は11番
		カテゴリ5番「情報」のメニュー2番「関係一覧」は52番など。

		FLAGに保存する目的だったので、初期値０と見分けるためなるべく１オリジンで割り振っています。

		まだ他のメニューから直接、選択可否条件を呼ばれているファイルや（能力表示等）
		番号を直接分岐条件にされている・リセットに使用されているファイルがあるので（会いに行く等）
		番号を入れ替える際はご注意ください。

		判定用関数のSHOP_LIFE_CHECKとSHOP_LIFE_CHECKCHARAとSHOP_LIFE_CHECKCHARA_SUBで検索したら
		その辺りは確認できると思います。


	+カテゴリとメニューの文字数
		カテゴリー名は全角２文字　SHOP_LIFE_CATEGORY.ERBで指定。

		メニュー名は全角５文字　各メニューのファイル@SHOP_LIFE_NAME{メニュー番号}に設置。

		スペース調整と[]の指定は不要に（SHOP_LIFE_FUNCTION.ERB @COLUMN_LEFT_PRINTBUTTON）


	+常に選択メニュー番号を保存するように
		FLAG:拠点フェイズコマンド番号に保存します。
		各種判定や入力処理・表示を呼び出すとき使用しています。

		常に保存するので、右カラムに表示のないメニューを選択すると
		右カラムが白紙になってしまいます。

		これを避けるためには右カラムに表示のあるメニューかそうではないメニューか
		メニューファイルに判定する関数をつくって保存を分け、
		表示がなければ最新の右カラムに表示のあるメニュー番号を呼び出すことになりそう。


	+SHOP_LIFE_AとBを統合
		Bのメニューはそれほど多くないので、処理を統合ました。
		基本的な処理は同じものを使用します。

		それぞれのメニューファイル選択可否判定に捕虜先チェックを加えました。
		主人公が捕虜のときはAのメニューを
		主人公が捕虜でないときはBのメニューを弾きます。


	+リストを標準/２段組上/２段組下の３関数にまとめ
		リストを関数化するとき悩みの種だったのが、
		ボタンを選択中カラーで表示する際に指定するCFLAG類の違いでした。

		これらは関数内でループ処理を行いながらキャラを参照して指定していることが多く、
		リストそのものに引数を渡しにくく感じました。

		たぶん作者様がつくってくださればこの辺りの処理もまとまってしまうと思うんですが、
		自己流の解決策として、メニューファイル側に表示ボタン指定用の関数を置いて
		リスト関数からTRYCALLFORMで呼び出す形にしてみました。

		あまりきれいではありませんが、表示の柔軟性は高くできそうです。

		メニューファイルに表示ボタン指定関数が関数が存在しない場合は
		オンカラーなしのデフォルトボタンを表示します。


	+右カラムの行番号カウントを不要に
		右カラムに表示する内容を作るとき、行番号を数えて
		左カラムのボタンを指定するのが処理が大変だったので、
		左カラムのボタン表示を自動的に行うようにしました。

		カラム表示開始時、FIRSTLINEのようにLINECOUNTを保存する
		FIRST_COLUMN_RIGHT_LINEをリセットします（CALL START_COLUMN）

		右カラムではPRINTL やPRINTFORML の代わりに改行用関数を呼びます（CALL COLUMN_RIGHT_PRINTL）
		これは改行を行うと共に、
		現在の行番号を確認しながら左カラムに該当するボタンを表示します。

		左カラムの表示や行番号を考えずに
		右カラムの表示をつくる作業ができるようになりました。

		ラインも専用の関数を置いて、暗めにして文字を引き立たせてみました。

		CALL COLUMN_RIGHT_PRINTL
		CALL COLUMN_RIGHT_LINE
		CALL COLUMN_RIGHT_PRINTL
		↑右カラムの表示処理でこんな感じに並ぶことが多いので
		　まとめてしまおうかとも思ったんですが、
		　あまりまとめると柔軟性がなくなってリスト作成とかがやりにくいので
		　とりあえずそのままになってます。


	+選択可否判定について
		メニューの選択可否判定と選択可能キャラ存在判定を、
		一か所でまとめて行うように変えました。

		選択可能キャラ存在判定→メニュー選択可否判定の順に行い
		メニューが選択不可なら、選択可能キャラが存在しても
		SHOP_AVAIL:{メニュー番号} = 0で上書きします。

		手引きは下段リストの選択可否判定がメニューの選択可否判定に影響しそうで
		これでは不足になり、処理追加してます。


	+左カラムのボタン整列
		選択可能なカテゴリとメニューを配列:行番号に保存して
		各行番号に整列させて表示できるようにしました。

		COLUMN_LEFT_CATEGORY_NUM:行番号 = 表示可能なカテゴリ番号
		COLUMN_LEFT_MENU_NUM:行番号 = 表示可能なメニュー番号

		カテゴリ内に表示できるメニューがひとつもなければ
		カテゴリも表示しません。

		２つめのカテゴリから、カテゴリ間に空行をあけて表示します。

		残行動回数や休憩や設定系ボタンは
		これまで通り固定行に表示します。
		その他のメニューは可変行で表示するように分けました。

		選択不可のメニューもこれまで通りグレー表示したい場合、
		SHOP_LIFE_COLUMN_LEFT.ERB @COLUMN_LEFT_MENULINE_SAVEで指定している
		SHOP_AVAILを参照する条件を削るだけで、できると思います。
		（ボタン側が元々SHOP_AVAILを参照してグレー表示に分岐しているため）


	+SLGは手付かず
		設定の項番が変わってしまいSLG側も揃えた方が良くなっていますが
		ただでさえSHOPをまるごと弄っていて改変範囲が巨大になるので、
		SHOPファイルの外は弄っていません。

		とりあえず動くようにSHOP.ERBのTIME分岐で番号を分けました。


	+他にしたこと
		+右カラムのサブタイトルを表示する関数をつくり	
		 残り行動回数の消費量、金の消費量等を定型的に表示するように

		+触手部屋を料理長の表示に合わせて右カラムに改変

		+他表示の整理関連


##備考
	+「服を替える」の選択可否判定
		最新版も1025が婚姻の儀と同番号で
		どの番号を割り当てると良いかわからなかったのでそのままに

	+「捕虜の扱い」の選択可能キャラ存在判定
		「ARG:0, 2,」の指定があり、非表示時も表示され上手く動かなかったので
		おそらくCHECK91の削除痕かと思い削除

	+「手引させる」の選択可否判定
		スレで手引きがうまく動いていないと見かけて
		試したらあなたが一人で手引き実行できてしまったので
		条件を見直してみました。

		内通者が存在しなくてもメニューが表示され、
		内通者を選択しなくても上のカラムにクリックできるキャラがいる状態。

		今の判定で通常のメニューはCHECK真　CHECKCHARA真なら通してしまいますが、
		手引きはCHECKCHARA_SUBが必須なので例外的にCHECKでCHECK_SUBも確認して
		一人以上必要と条件を追加

		夜這い側で夜這いの助手がオンになっていると判定でひっかけてしまうっぽかったので
		入力処理で夜這いの助手をリセット
		ボタン表示時も夜這いの助手をカウントして、
		助手が誰もいなければ強制的にグレー表示するように。

		効率が悪そうな処理になってしまった。
		手元で動かした感じ、手引きのイメージ通りになった気がしますが、
		意図が違ったりまだおかしかったらすみません。

	+「あてがう」
		最新版のあてがうで助手が無限に選択できる？


	+拠点フェイズ選択コマンド番号
		強制的に全メニュー番号をとるようにしたので
		フレームでないメニューを開いた後
		クリアするくらいしかできなくなってる点


	+新・説得させるがきちんと取り込めているか不安


	+他メニューからメニュー番号で条件を呼び出ししているメニューがいくつかある
		メニュー番号を入れ替えるとエラーが発生するため
		使い回すものは名前をつけて上のファイルに置いて
		それぞれのメニューから呼んだ方がいいかも


	+休憩・設定辺りはSHOP_LIFE.ERBで直接番号で判定していたりする
		会いに行くもページのリセット処理にちょくちょく使われている
		この辺りもどうしたものか


##最新版へのマージ状態

	###変更ファイルまとめ
		SHOP_CHECK_SELECTABLE.ERB
		SHOP_LIFE.ERB
		SHOP_LIFE_IAN.ERB
		育児.ERB

	###マージ部分詳細
		+SHOP_CHECK_SELECTABLE.ERB
			慰安でヤられる側・あてがう・説得させるの選択可否判定
			変更に対応

		+LIFE_MENU.ERB
			説得させるのメニュー表示
			変更に対応したつもりだが、かなり変更されているため
			これで正しいかちょっと怪しい

		+SHOP_LIFE.ERB
			メニュー選択可否判定
			2夜這い・3手引きにCFLAG:MASTER:行動不能状態 == 1 || COOLTIME:MASTER:0 > 1追加対応
			12説得・15労働からのCFLAG:MASTER:行動不能状態 == 1 || COOLTIME:MASTER:0 > 1削除対応

			説得させる
				;選択軟禁者（被説得者）の選択を解除
				FLAG:72 = 0
			削除対応

			ページ移動処理
				リスト１のページ移動処理
				FLAG:72のリセット削除対応

		+会いに行く
			CALL 教育(ARG, MASTER, CFLAG:ARG:教育方針)
			後のLINES_SHOP = LINECOUNT追加対応

		+説得させる
			;説得対象のIDを水色に反転させるために保存
			FLAG:72 = GET_ID(ARG:0)
			↓
			CALL SHOP_LIFE_SETTOKU(ARG:0)
			IF !RESULT
				REDRAW 1
			ELSE
				SHOP_TIME ++
				BEGIN TURNEND
			ENDIF
			変更対応

			リスト２
			DIM 選択軟禁者
			DIM 選択説得者
			削除対応

			リスト２入力処理
			選択軟禁者 = ID_TO_CHARA(FLAG:72)
			選択説得者 = ARG:0
			;選択可能な条件を満たしていないキャラなら戻る
			RESULT = 0
			TRYCALLFORM CHECK_SELECTABLE_SETTOKU(選択説得者)
			IF RESULT != 1
				RETURN 0
			ENDIF
			
			;選択説得者が説得中の相手(LOCAL:0)
			LOCAL:0 = SETTOKU_CHARA(選択説得者)
			;説得対象が選択されていない or 既に担当している（解除する）
			IF 選択軟禁者 < 0 || LOCAL:0 == 選択軟禁者
				SIF LOCAL:0 >= 0
					CFLAG:(LOCAL:0):説得担当者 = 0
			ELSE
				;すでにいる担当の相手と交換
				SIF LOCAL:0 >= 0
					CFLAG:(LOCAL:0):説得担当者 = CFLAG:選択軟禁者:説得担当者
				;最終処理
				CFLAG:(選択軟禁者):説得担当者 = GET_ID(選択説得者)
			ENDIF
			↓
			;選択可能な条件を満たしていないキャラなら戻る
			RESULT = 0
			TRYCALLFORM SHOP_LIFE_CHECKCHARA_SUB{FLAG:拠点フェイズ選択コマンド}(ARG:0)
			IF RESULT != 1
				RETURN 0
			ENDIF

			LOCAL:5 = 0
			FOR LOCAL:0, 0, CHARANUM
				IF CFLAG:(LOCAL:0):捕虜調教の助手
					LOCAL:5 ++
				ENDIF
			NEXT

			IF CFLAG:(ARG:0):捕虜調教の助手 || LOCAL:5 < 3
				;調教参加フラグを反転
				CFLAG:(ARG:0):捕虜調教の助手 = !CFLAG:(ARG:0):捕虜調教の助手
			ENDIF
			変更対応→チェック用の関数名は変化している

		+夜這い・手引き
			好感度他減少 = MAX(200 - ABL:ARG:欲望 * 20 - ABL:ARG:奉仕 * 20 ,0)
			↓
			好感度他減少 = LIMIT(RAND(100, 200) - ABL:ARG:欲望 * 20 - ABL:ARG:奉仕 * 20 ,0, 100)

			CFLAG:(ARG:0):2 -= 好感度他減少
			CFLAG:(ARG:0):3 -= 好感度他減少
			CFLAG:(ARG:0):4 -= 好感度他減少
			↓
			SIF CFLAG:(ARG:0):好感度 > 0
				CFLAG:(ARG:0):好感度 -= 好感度他減少
			SIF CFLAG:(ARG:0):従属度 > 0
				CFLAG:(ARG:0):従属度 -= 好感度他減少
			SIF CFLAG:(ARG:0):依存度 > 0
				CFLAG:(ARG:0):依存度 -= 好感度他減少

			CALL CHANGE_RELATION_C_TO_C(CFLAG:ARG:所属, CFLAG:MASTER:所属, 好感度他減少 / 10 * (-1), 好感度他減少 / 10)
			↓
			CALL CHANGE_RELATION_C_TO_C(CFLAG:ARG:所属, CFLAG:MASTER:所属, RAND(50, 100) * -1, RAND(50, 100))
			変更対応

			手引き側 TEBIKI_ABLE(ARG) == 2が YOBAI_ABLE(ARG) == 2になっていたのでここは変更せず
			（changeLog.mdで変更について見つけられなかった＆最新版にもTEBIKI_ABLEが存在したので）
			統合だったらすみません

		+あてがう
			ITEM:A_絶倫丸 = 99	追加対応

		+慰安
			ITEM:A_絶倫丸 = 99	追加対応

		+捕虜の調教
			牢屋から出す→軟禁に変更

		+休憩
			LINES_SHOP = LINECOUNT　移動対応

			CALL PRINT_ADD_EXP(MASTER, EXPNAME:LOCAL, LIMIT(余剰 / 4, 1, 5), 1)
			↓
			CALL PRINT_ADD_EXP(MASTER, EXPNAME:LOCAL, LIMIT(余剰 / 2, 1, 5), 1)

			CALL CHANGE_RELATION_O_TO_O(LOCAL, MASTER, 余剰 / 4, 余剰 / 4 * -1)
			CALL CHANGE_RELATION_O_TO_O(MASTER, LOCAL, 余剰 / 4, 余剰 / 4 * -1)
			↓
			CALL CHANGE_RELATION_O_TO_O(LOCAL, MASTER, MIN(余剰, 5), MAX(-余剰, -5))
			CALL CHANGE_RELATION_O_TO_O(MASTER, LOCAL, MIN(余剰, 5), MAX(-余剰, -5))

			LOCAL = LIMIT(余剰 / 4, 1, 5) * 500→LOCAL = LIMIT(余剰 / 2, 1, 5) * 500

		+育児
			PRINTFORML {EXP:(MTAR:0):GET_EXP(LOCAL)}
			PRINTFORML {EXP:(MTAR:0):GET_EXP(LOCAL)}
			削除対応

